// 为 JavaScript 变量加上了类型声明,变量使用冒号,声明了它的类型为String
let foo3: string;

// 类型声明的写法，一律为在标识符后面添加“冒号 + 类型”。函数参数和返回值，也是这样来声明类型。
// 函数toString()的参数num的类型是number。参数列表的圆括号后面，声明了返回值的类型是string。
function toString(num: number): string {
  return String(num);
}

// 变量的值应该与声明的类型一致，如果不一致，TypeScript 就会报错。
// 报错
// foo = 123;
foo3 = "牛肉";

// TypeScript 规定，变量只有赋值后才能使用，否则就会报错。
let x1: number;
// 变量x没有赋值就被读取，导致报错。而 JavaScript 允许这种行为，不会报错，没有赋值的变量会返回undefined。
// console.log(x1) // 报错

// 类型声明并不是必需的，如果没有，TypeScript 会自己推断类型。
let foo2 = 123;
// 如果变量foo2更改为其他类型的值，跟推断的类型不一致，TypeScript 就会报错。
// foo2 = "h1"

// 变量foo的类型推断为number，后面赋值为字符串，TypeScript 就报错了。
function toString2(num: number) {
  return String(num);
}
